package co.edu.uniandes.ecos.itera.tsp.interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Tiempos;
import co.edu.uniandes.ecos.itera.tsp.mundo.DelegadoNegocio;
import co.edu.uniandes.ecos.itera.tsp.mundo.Desarrollador;
import co.edu.uniandes.ecos.itera.tsp.mundo.Proyecto;
import co.edu.uniandes.ecos.itera.tsp.mundo.Rol;

/**
 * @author ojato
 * Panel para ofrecer funcionalidad del manejo equipo
 */

@Tiempos( { @LogT(date = "2011-03-21", min = 125, taskId = 82)})
public class ManejarEquipo extends JPanel implements ActionListener {
	/**
	 * Referencia al objeto que permite trabajar las transacciones de negocio
	 */
	private DelegadoNegocio accesoAMundo;

	/**
	 * Defecto que se esta trabajando en estos momentos en esta pantalla
	 */
	private Proyecto proyecto;

	/**
	 * Referencia al objeto contenedor. Este es el objeto que maneja la pantalla
	 * principal, o sea el admon de proyectos
	 */
	private MenuPrincipal referenciaAContenedor;

	/**
	 * Determina como unico a este objeto
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Constante para definir la accion de almacenar
	 */
	private static final String ALMACENAR = "Almacenar";

	/**
	 * Nombre del desarrollador
	 */
	private JTextField txtNombre;
	/**
	 * Codigo del desarrollador
	 */
	private JTextField txtCodigo;
	
	/**
	 * Listado de proyectos en el sistema
	 */
	private JComboBox listadoProyectos;
	/**
	 * Listado de roles segun TSP
	 */
	private JComboBox listadoRoles;
	/**
	 * Boton de Almacenar
	 */
	private JButton btnAlmacenar;
	/**
	 * Entida desarrollador que se esta visualizando
	 */
	private Desarrollador desarrollador;

	/**
	 * Consutrctor por defecto
	 * 
	 * @param mundo
	 *            Referencia al objeto que permite trabajar las transacciones de
	 *            negocio
	 */
	public ManejarEquipo(DelegadoNegocio mundo, MenuPrincipal contenedor) {
		this.accesoAMundo = mundo;
		this.referenciaAContenedor = contenedor;
		this.proyecto = null;

		this.pintarse();
	}

	/**
	 * Se encarga de pintar los elementos de la pantalla
	 */

	private void pintarse() {
		setLayout(new GridLayout(6, 2));
		setPreferredSize(new Dimension(400, 200));

		TitledBorder border = BorderFactory
				.createTitledBorder("Manejador de Equipos");
		border.setTitleColor(Color.BLUE);
		setBorder(border);
		//listado de proyectos
		List<Proyecto>proyectos = accesoAMundo.listarProyectos();
		String nombres = "Seleccione un proyecto,";
		for(Proyecto proyecto: proyectos )
		{
			nombres += proyecto.getNombreProyecto()+",";
			
		}
		nombres.substring(0, nombres.length()-2);
		String[] nombresProyectos = nombres.split(",");

		add(new JLabel("Proyecto"));
		listadoProyectos = new JComboBox(nombresProyectos);
		listadoProyectos.setSelectedIndex(0);
		add(listadoProyectos);

		//listado de roles
		String[]roles = {"Lider","Lider de Calidad","Lider de Desarrollo","Lider De soporte","lider de planeacion"};
		
		add(new JLabel("Rol"));
		listadoRoles = new JComboBox(roles);
		listadoRoles.setSelectedIndex(0);
		add(listadoRoles);

		
		add(new JLabel("Nombre del Desarrollador"));
		this.txtNombre = new JTextField(30);
		add(this.txtNombre);

		add(new JLabel("Codigo del Desarrollador"));
		this.txtCodigo = new JTextField(30);
		add(this.txtCodigo);

		

		this.btnAlmacenar = new JButton("Guardar");
		this.btnAlmacenar.setActionCommand(ALMACENAR);
		this.btnAlmacenar.addActionListener(this);
		add(this.btnAlmacenar);
	}



	/**
	 * Almacena el Desarrollador.
	 */
	@Loc(size = 170, taskId = 82)
	public void almacenar() {
		if (this.txtNombre == null
				|| this.txtNombre.toString().trim().length() == 0) {
			JOptionPane.showMessageDialog(null,
					"Debe proveer los datos que se le estan preguntando",
					"Error", JOptionPane.ERROR_MESSAGE);
		} else {
			String proySel = listadoProyectos.getSelectedItem().toString();
			
			List<Proyecto> incluidos= accesoAMundo.listarProyectos();
			for(Proyecto buscado : incluidos)
			{
				
				if(buscado.getNombreProyecto().equals(proySel))
				{
					this.proyecto = buscado;
					break;
				}
			}
			String rolSel = listadoRoles.getSelectedItem().toString();
			int codigo = listadoRoles.getSelectedIndex();
			List<Rol> roles = proyecto.listarRoles();
			Rol seleccionado = null;
			for(Rol rol:roles)
			{
				
				if(rol.getCodigo() == codigo)
				{
					seleccionado  = rol;
					break;
				}
			}
			if(seleccionado == null)
			{
				seleccionado = new Rol();
				seleccionado.setCodigo(codigo);
				seleccionado.setNombre(rolSel);
				proyecto.agregarRol(seleccionado);
				
			}
			
			if (this.proyecto != null) // si se esta creando un proyecto
			{
				try {
					if( txtNombre.getText().trim().length()>0 && txtCodigo.getText().trim().length()>0 )
					{
					accesoAMundo.agregarDesarrollador(proyecto, txtNombre.getText(), txtCodigo.getText(), seleccionado);
					JOptionPane
					.showMessageDialog(
							null,
							"La información se ha guardado",
							"Error", JOptionPane.ERROR_MESSAGE);
					}
					else
					{
						JOptionPane
						.showMessageDialog(
								null,
								"Ingrese la información solicitada",
								"Error", JOptionPane.ERROR_MESSAGE);
						
					}
				} catch (NumberFormatException e) {
					JOptionPane
					.showMessageDialog(
							null,
							"El código debe ser numérico",
							"Error", JOptionPane.ERROR_MESSAGE);
				} catch (Exception e) {

					JOptionPane
					.showMessageDialog(
							null,
							"No se ha logrado guardar la información, se generó el siguiente error: "+e.getMessage(),
							"Error", JOptionPane.ERROR_MESSAGE);
				}
			} else // Si ya existe el proyecto
			{
				JOptionPane
						.showMessageDialog(
								null,
								"Debe seleccionar un proyecto para la creación del desarrollador",
								"Error", JOptionPane.ERROR_MESSAGE);
			}

			this.referenciaAContenedor.cargarArbol();
		}
	}

	/**
	 * Acciones a realizar en la pantalla
	 */
	@Override
	
	public void actionPerformed(ActionEvent e) {
		String comando = e.getActionCommand();

		if (comando.equals(ALMACENAR))
			this.almacenar();
	}
	/**
	 * Se encarga de cargar El defecto en pantalla para poderlo manejar por el
	 * usuario
	 * 
	 * @param defectoACargar
	 *            Informacion del defecto que se desea actualizar
	 */
	@Loc(size = 3, taskId = 151)
	@Tiempos( { @LogT(date = "2011-03-26", min = 5, taskId = 151) })
	public void cargarEntidad(Desarrollador desarrollador, Rol rol) {
		this.desarrollador = desarrollador;
		if (this.desarrollador != null) {
			this.txtNombre.setText(desarrollador.getNombre());
			this.txtCodigo.setText(((Integer) desarrollador.getCodigo())
					.toString());
			this.listadoRoles.setSelectedItem(rol.getNombre());
			
		}

	}

}
